/****************************************************************************
* Copyright (c) 2008, j. montgomery, ATGi                                   *
* All rights reserved.                                                      *
*                                                                           *
* Redistribution and use in source and binary forms, with or without        *
* modification, are permitted provided that the following conditions        *
* are met:                                                                  *
*                                                                           *
* - Redistributions of source code must retain the above copyright          *
*   notice, this list of conditions and the following disclaimer.           *
*                                                                           *
* - Redistributions in binary form must reproduce the above                 *
*   copyright notice, this list of conditions and the following             *
*   disclaimer in the documentation and/or other materials provided         *
*   with the distribution.                                                  *
*                                                                           *
* - Neither the name of ATGi nor the names of its contributors may          *
*   be used to endorse or promote products derived from this software       *
*   without specific prior written permission.                              *
*                                                                           *
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS       *
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT         *
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS         *
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE            *
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,       *
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES                  *
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR        *
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)        *
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,       *
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)             *
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED       *
* OF THE POSSIBILITY OF SUCH DAMAGE.                                        *
*****************************************************************************
*/
using System;
using System.Text;

namespace DnSmtp.Message
{
	/// <summary>
	/// * - not have the 'AttachmentFileName' property.
	/// * - have a 'Body' property of type string, gettable and settable.
	/// </summary>
	public class MessageContent : IMailContent, ICloneable
	{
		#region Fields
		private MimeType _mimeType;
		private string _messageBody;
		private Encoding.IEncodingStrategy _encodingStrategy;
		#endregion Fields

		#region Properties
		public Encoding.IEncodingStrategy EncodingStrategy 
		{
			get 
			{
				return _encodingStrategy;
			}
			set 
			{
				_encodingStrategy = value;
			}
		}

		public MimeType MimeType 
		{
			get { return _mimeType; }
			set
			{
				if(value.ToString().StartsWith("multipart")) 
				{
					throw new ApplicationException("MessageContents cannot have a Multipart mime type.");
				}
				else 
				{
					_mimeType = value;
				}
			}
		}

		public string MessageBody 
		{
			get { return _messageBody; }
			set { _messageBody = value; }
		}
		#endregion Properties

		#region Constructors
		public MessageContent()
		{

		}

		public MessageContent(MimeType mimeType, string mesageBody) : this()
		{
			_mimeType = mimeType;
			_messageBody = mesageBody;
			_encodingStrategy = _mimeType.PreferedEncodingStrategy;
		}
		#endregion Constructors

		public string BuildMessage()
		{
			string mailBoundry = MailMessage.GenerateMailBoundary();

			StringBuilder sb = new StringBuilder();
			sb.Append(MailMessage.CONTENT_TYPE_HEADER);
            sb.Append(_mimeType.ToString());			
			sb.Append("; ");
            sb.Append(MailMessage.CHARSET_USASCII_HEADER); // Not an attachment 
			sb.Append(MailMessage.CRLF);
			sb.Append("Content-Transfer-Encoding: ");
            sb.Append(_encodingStrategy.Name);
            sb.Append(MailMessage.CRLF);
			sb.Append(MailMessage.CRLF);
			sb.Append(_encodingStrategy.Encode(this.MessageBody));
			sb.Append(MailMessage.CRLF);
			return sb.ToString();
		}
	
		#region ICloneable Members

		public MessageContent Clone()
		{
			return this.MemberwiseClone() as MessageContent;
		}

		object ICloneable.Clone()
		{
			return this.Clone();
		}

		#endregion
	}
}
